import random

from entiys.map.mapMovePolicy import mapMovePolicy
from entiys.methods.augument.SaveAttribute import SaveAttribute
from entiys.npc.NPCLoader import NPCLoader
from entiys.npc.NPCSave import NPCSave


def mapFilter(npcname, att: dict):
    return att.get("所在位置") == npcname


def bigThanMe(npcname, att, cA, mV):
    return att.get(cA) > mV


def smallThanMe(npcname, att, cA, mV):
    return att.get(cA) < mV


class NpcSaveWithFilter:
    """
    这是预制好了一些常见过滤器的NpcSave包装类 支持
    """

    def __init__(self, npcSave: NPCSave):
        self.npcSave = npcSave
        self.saveAttribute = SaveAttribute(saveName=self.npcSave.save)

    def setInMapAttribute(self, mapname, attribute, value=None, valueMethod=None):
        """
        设置属性到 在某个地图上的所有角色
        :param mapname: 地图名称
        :return:
        """
        return self.npcSave.setNpcAtttributeByMethod(
            method=mapFilter,
            valueMethod=valueMethod,
            value=value,
            attribute=attribute
        )

    def setAttributeBig(self, computeAttribute, minValue, attribute, value=None, valueMethod=None):
        """
        设置属性到比自己大的值上
        :param computeAttribute: 用于进行比较的属性键
        :param minValue: 用于进行比较的属性值
        :param attribute: 重新设置的属性键
        :param value: 新值
        :param valueMethod: 新值函数
        :return:
        """
        return self.npcSave.setNpcAtttributeByMethod(
            method=lambda name, attri: bigThanMe(name, attri, computeAttribute, minValue),
            valueMethod=valueMethod,
            value=value,
            attribute=attribute
        )

    def setAttributeSamll(self, computeAttribute, maxValue, attribute, value=None, valueMethod=None):
        """
        设置属性到比自己小的值上
        :param computeAttribute: 用于进行比较的属性键
        :param minValue: 用于进行比较的属性值
        :param attribute: 重新设置的属性键
        :param value: 新值
        :param valueMethod: 新值函数
        :return:
        """
        return self.npcSave.setNpcAtttributeByMethod(
            method=lambda name, attri: smallThanMe(name, attri, computeAttribute, maxValue),
            valueMethod=valueMethod,
            value=value,
            attribute=attribute
        )

    def randomMoveMap(self,
                      charaname,
                      _mapMovePolicy: mapMovePolicy = None,
                      allow_to_location=None):
        """
        使用_mapMovePolicy [不需要指定该类的SaveName] 生成指定的地图集合然后让一名NPC随机进行移动
        :param charaname: 移动的角色名称
        :param _mapMovePolicy: 移动的策略
        :param allow_to_location: 随机移动的时候允许在随机移动到当前角色的位置(角色从A移动到A的情况) 默认不开启
        :return:
        """
        # 加载当前的地图数据

        saveName = self.saveAttribute.saveName # 这是一个存档的加载器
        if _mapMovePolicy is None:
            _mapMovePolicy = mapMovePolicy() # 初始化一个 随机地图加载策略

        _mapMovePolicy.saveAttribute = SaveAttribute(saveName=saveName) # 交给地图加载策略器一个存档里的地图

        if allow_to_location:
            npcWhere = NPCLoader.getByName(charaname).get("所在位置")
            _mapMovePolicy.exclude.append(npcWhere)

        allow_run = _mapMovePolicy.to_list()
        self.npcSave.setNpcAttributeByName(
            charaname=charaname,
            attribute="所在位置",
            value=random.choice(allow_run)
        )


